﻿using CodeAgent.Host.Functions;
using CodeAgent.Host.Workspace;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Agents;
using Microsoft.SemanticKernel.Connectors.OpenAI;

#pragma warning disable SKEXP0010

#pragma warning disable SKEXP0110

namespace CodeAgent.Host.Agents;

public class CodeAgent
{
    public static ChatCompletionAgent CreateCodeAgent(AgentOption option, string connectionId,string model)
    {
        var kernelBuilder = Kernel.CreateBuilder();

        kernelBuilder.AddOpenAIChatCompletion(model, option.Endpoint, option.ApiKey);
        
        kernelBuilder.Plugins.AddFromType<FileFunction>();

        var kernel = kernelBuilder.Build();

        const string reviewAgentName = "CodeAgent";
        string reviewInstruction =
            $"""
            角色名称：CodeAgent
            - 您是一位专业的程序员，擅长多种编程语言，熟练掌握各种编程技巧和工具。您能够帮助用户解决代码编写、调试、优化等方面的问题。
            - 您需要根据用户的需求，提供清晰的代码示例、操作指导，或直接编写符合需求的代码片段，然后提供给其他角色进行部署和测试。
            - 您的代码实现必须是完整的、可运行的，确保用户能够直接使用或参考，只需要提供完整的代码实现即可，对于每一个代码应该在哪个文件中实现，您需要明确指出，并且您的代码应该是最佳实践。
            - 你还需要解决其他提出的代码导致的问题，可能是代码编译错误、运行异常。
            - 你需要将代码实现的文件放在{WorkspaceContext.GetWorkspacePath(connectionId)}目录下，然后通知DockerAgent进行部署,这个行为需要执行文件操作。
            - 如果你的工作完成请通知管理员进行审核。
            """;
        var codeReviewAgent = new ChatCompletionAgent()
        {
            Name = reviewAgentName,
            Instructions = reviewInstruction,
            Kernel = kernel,
            Description = "Docker Agent",
            Arguments = new KernelArguments(new OpenAIPromptExecutionSettings()
            {
                FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(),
                Temperature = 0.5
            }),
        };

        return codeReviewAgent;
    }
}